package com.agan.redis.controller;

import com.agan.redis.config.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
/**
 * 如此的大的并发量，唯一的出路就是减少redis的访问量
 *  1.文章服务采用了集群部署，在线上可以部署N台
 *  2.每个文章服务，增加了一级JVM缓存，即用Map存储在JVM
 *  Map<Long,Map<Integer,Integer>> =Map<时间块，Map<文章Id,访问量>>
 *      时间块：
 *      把时间切割成一块块，一般文章咋子一小时，30分钟，5分钟的时间内产生了多少阅读量
 *
 *3.一级缓存定时消费    concurrentHashMap
 * 定时器，定时5分钟从jvm的map把时间块的阅读pv取出来，然后push到redis的list数据结构中
 *
 * 4.二级缓存定时器消费  redis消费
 * 定时6分钟，从redis的list数据结构pop弹出Map<文章id，访问量pv> 弹出做两件事
 *   保存到数据库，同步到redis缓存的计数器incr
 *
 */
@RestController
@Slf4j
public class ViewController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping(value = "/view")
    public String view(Integer id) {
        String key= Constants.CACHE_ARTICLE+id;
        //调用redis的get命令
        String n=this.stringRedisTemplate.opsForValue().get(key);
        log.info("key={},阅读量为{}",key, n);
        return n;
    }
}
